import { IPSModelSortable } from '../../ipsmodel-sortable';
import { IPSDataEntityObject } from '../ipsdata-entity-object';
import { IPSDEActionInput } from './ipsdeaction-input';
import { IPSDEActionLogic } from './ipsdeaction-logic';
import { IPSDEActionParam } from './ipsdeaction-param';
import { IPSDEActionReturn } from './ipsdeaction-return';
import { IPSDEActionVR } from './ipsdeaction-vr';
import { IPSDEOPPriv } from '../priv/ipsdeoppriv';
import { IPSSysPFPlugin } from '../../res/ipssys-pfplugin';
import { IPSSysSFPlugin } from '../../res/ipssys-sfplugin';
import { IPSSubSysServiceAPIDEMethod } from '../../service/ipssub-sys-service-apidemethod';
import { IPSSysTestCase } from '../../testing/ipssys-test-case';

/**
 *
 * 子接口类型识别属性[actionType]
 * @export
 * @interface IPSDEAction
 */
export interface IPSDEAction extends IPSDataEntityObject, IPSModelSortable {
  /**
   * 行为持有者
   * @description 值模式 [逻辑所有者] {1：后台、 2：前台、 3：后台及前台 }
   * @type {( number | 1 | 2 | 3)}
   * @default 3
   */
  actionHolder: number | 1 | 2 | 3;

  /**
   * 行为模式
   * @description 值模式 [实体行为模式] {CREATE：创建数据、 READ：读取数据、 UPDATE：更新数据、 DELETE：删除数据、 CUSTOM：自定义操作、 GETDRAFT：获取草稿、 UNKNOWN：未知操作、 MOVEORDER：移动位置、 CHECKKEY：检查主键、 USER：用户自定义、 USER2：用户自定义2、 USER3：用户自定义3、 USER4：用户自定义4 }
   * @type {( string | 'CREATE' | 'READ' | 'UPDATE' | 'DELETE' | 'CUSTOM' | 'GETDRAFT' | 'UNKNOWN' | 'MOVEORDER' | 'CHECKKEY' | 'USER' | 'USER2' | 'USER3' | 'USER4')}
   */
  actionMode: string | 'CREATE' | 'READ' | 'UPDATE' | 'DELETE' | 'CUSTOM' | 'GETDRAFT' | 'UNKNOWN' | 'MOVEORDER' | 'CHECKKEY' | 'USER' | 'USER2' | 'USER3' | 'USER4';

  /**
   * 行为标记
   * @type {string}
   */
  actionTag: string;

  /**
   * 行为标记2
   * @type {string}
   */
  actionTag2: string;

  /**
   * 行为标记3
   * @type {string}
   */
  actionTag3: string;

  /**
   * 行为标记4
   * @type {string}
   */
  actionTag4: string;

  /**
   * 行为类型
   * @description 值模式 [实体行为类型] {USERCUSTOM：用户自定义、 DELOGIC：实体处理逻辑、 BUILTIN：内置方法、 SELECTBYKEY：通过键值获取、 USERCREATE：用户扩展建立、 USERUPDATE：用户扩展更新、 USERSYSUPDATE：用户扩展系统更新、 SCRIPT：脚本代码、 REMOTE：远程接口行为 }
   * @type {( string | 'USERCUSTOM' | 'DELOGIC' | 'BUILTIN' | 'SELECTBYKEY' | 'USERCREATE' | 'USERUPDATE' | 'USERSYSUPDATE' | 'SCRIPT' | 'REMOTE')}
   */
  actionType: string | 'USERCUSTOM' | 'DELOGIC' | 'BUILTIN' | 'SELECTBYKEY' | 'USERCREATE' | 'USERUPDATE' | 'USERSYSUPDATE' | 'SCRIPT' | 'REMOTE';

  /**
   * 执行后附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  getAfterPSDEActionLogics(): IPSDEActionLogic[] | null;

  /**
   * 执行后附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  get afterPSDEActionLogics(): IPSDEActionLogic[] | null;

  findAfterPSDEActionLogic(objKey: any): IPSDEActionLogic | null;

  /**
   * 批操作模式
   * @description 值模式 [实体行为批操作模式] {0：不支持、 1：支持、 2：仅支持批操作、 5：支持（事务）、 6：仅支持批操作（事务） }
   * @type {( number | 0 | 1 | 2 | 5 | 6)}
   * @default 0
   */
  batchActionMode: number | 0 | 1 | 2 | 5 | 6;

  /**
   * 执行前附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  getBeforePSDEActionLogics(): IPSDEActionLogic[] | null;

  /**
   * 执行前附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  get beforePSDEActionLogics(): IPSDEActionLogic[] | null;

  findBeforePSDEActionLogic(objKey: any): IPSDEActionLogic | null;

  /**
   * 检查附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  getCheckPSDEActionLogics(): IPSDEActionLogic[] | null;

  /**
   * 检查附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  get checkPSDEActionLogics(): IPSDEActionLogic[] | null;

  findCheckPSDEActionLogic(objKey: any): IPSDEActionLogic | null;

  /**
   * 代码标识
   * @type {string}
   */
  codeName: string;

  /**
   * 子系统扩展
   * @description 值模式 [实体扩展模式] {0：无扩展、 2：子系统功能扩展 }
   * @type {( number | 0 | 2)}
   * @default 0
   */
  extendMode: number | 0 | 2;

  /**
   * 逻辑名称
   * @type {string}
   */
  logicName: string;

  /**
   * 行为次序
   * @type {number}
   * @default 99999
   */
  orderValue: number;

  /**
   * 性能优化预警时长（ms）
   * @type {number}
   * @default -1
   */
  pOTime: number;

  /**
   * 调用输入对象
   *
   * @type {IPSDEActionInput}
   */
  getPSDEActionInput(): IPSDEActionInput | null;

  /**
   * 调用输入对象
   *
   * @type {IPSDEActionInput}
   */
  get psDEActionInput(): IPSDEActionInput | null;

  /**
   * 调用输入对象（必须存在）
   *
   * @type {IPSDEActionInput}
   */
  getPSDEActionInputMust(): IPSDEActionInput;

  /**
   * 行为参数集合
   *
   * @type {IPSDEActionParam[]}
   */
  getPSDEActionParams(): IPSDEActionParam[] | null;

  /**
   * 行为参数集合
   *
   * @type {IPSDEActionParam[]}
   */
  get psDEActionParams(): IPSDEActionParam[] | null;

  findPSDEActionParam(objKey: any): IPSDEActionParam | null;

  /**
   * 调用返回对象
   *
   * @type {IPSDEActionReturn}
   */
  getPSDEActionReturn(): IPSDEActionReturn | null;

  /**
   * 调用返回对象
   *
   * @type {IPSDEActionReturn}
   */
  get psDEActionReturn(): IPSDEActionReturn | null;

  /**
   * 调用返回对象（必须存在）
   *
   * @type {IPSDEActionReturn}
   */
  getPSDEActionReturnMust(): IPSDEActionReturn;

  /**
   * 行为附加值规则集合
   *
   * @type {IPSDEActionVR[]}
   */
  getPSDEActionVRs(): IPSDEActionVR[] | null;

  /**
   * 行为附加值规则集合
   *
   * @type {IPSDEActionVR[]}
   */
  get psDEActionVRs(): IPSDEActionVR[] | null;

  findPSDEActionVR(objKey: any): IPSDEActionVR | null;

  /**
   * 服务访问操作标识
   *
   * @type {IPSDEOPPriv}
   */
  getPSDEOPPriv(): IPSDEOPPriv | null;

  /**
   * 服务访问操作标识
   *
   * @type {IPSDEOPPriv}
   */
  get psDEOPPriv(): IPSDEOPPriv | null;

  /**
   * 服务访问操作标识（必须存在）
   *
   * @type {IPSDEOPPriv}
   */
  getPSDEOPPrivMust(): IPSDEOPPriv;

  /**
   * 外部服务接口方法
   *
   * @type {IPSSubSysServiceAPIDEMethod}
   */
  getPSSubSysServiceAPIDEMethod(): IPSSubSysServiceAPIDEMethod | null;

  /**
   * 外部服务接口方法
   *
   * @type {IPSSubSysServiceAPIDEMethod}
   */
  get psSubSysServiceAPIDEMethod(): IPSSubSysServiceAPIDEMethod | null;

  /**
   * 外部服务接口方法（必须存在）
   *
   * @type {IPSSubSysServiceAPIDEMethod}
   */
  getPSSubSysServiceAPIDEMethodMust(): IPSSubSysServiceAPIDEMethod;

  /**
   * 前端扩展插件
   *
   * @type {IPSSysPFPlugin}
   */
  getPSSysPFPlugin(): IPSSysPFPlugin | null;

  /**
   * 前端扩展插件
   *
   * @type {IPSSysPFPlugin}
   */
  get psSysPFPlugin(): IPSSysPFPlugin | null;

  /**
   * 前端扩展插件（必须存在）
   *
   * @type {IPSSysPFPlugin}
   */
  getPSSysPFPluginMust(): IPSSysPFPlugin;

  /**
   * 后台扩展插件
   *
   * @type {IPSSysSFPlugin}
   */
  getPSSysSFPlugin(): IPSSysSFPlugin | null;

  /**
   * 后台扩展插件
   *
   * @type {IPSSysSFPlugin}
   */
  get psSysSFPlugin(): IPSSysSFPlugin | null;

  /**
   * 后台扩展插件（必须存在）
   *
   * @type {IPSSysSFPlugin}
   */
  getPSSysSFPluginMust(): IPSSysSFPlugin;

  /**
   * 测试用例集合
   *
   * @type {IPSSysTestCase[]}
   */
  getPSSysTestCases(): IPSSysTestCase[] | null;

  /**
   * 测试用例集合
   *
   * @type {IPSSysTestCase[]}
   */
  get psSysTestCases(): IPSSysTestCase[] | null;

  findPSSysTestCase(objKey: any): IPSSysTestCase | null;

  /**
   * 行为参数模式
   * @description 值模式 [实体行为参数模式] {1：默认参数（设置指定参数项值）、 2：指定参数、 3：其它对象 }
   * @type {( number | 1 | 2 | 3)}
   * @default 1
   */
  paramMode: number | 1 | 2 | 3;

  /**
   * 准备附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  getPreparePSDEActionLogics(): IPSDEActionLogic[] | null;

  /**
   * 准备附加逻辑集合
   *
   * @type {IPSDEActionLogic[]}
   */
  get preparePSDEActionLogics(): IPSDEActionLogic[] | null;

  findPreparePSDEActionLogic(objKey: any): IPSDEActionLogic | null;

  /**
   * 实际执行行为
   *
   * @type {IPSDEAction}
   */
  getRealPSDEAction(): IPSDEAction | null;

  /**
   * 实际执行行为
   *
   * @type {IPSDEAction}
   */
  get realPSDEAction(): IPSDEAction | null;

  /**
   * 实际执行行为（必须存在）
   *
   * @type {IPSDEAction}
   */
  getRealPSDEActionMust(): IPSDEAction;

  /**
   * 临时数据模式
   * @description 值模式 [平台部件处理器临时数据模式] {0：无临时数据模式、 1：主数据模式、 2：从数据模式 }
   * @type {( number | 0 | 1 | 2)}
   * @default 0
   */
  tempDataMode: number | 0 | 1 | 2;

  /**
   * 测试行为模式
   * @description 值模式 [实体行为测试行为模式] {0：无测试行为、 1：有测试行为、 3：公开测试行为 }
   * @type {( number | 0 | 1 | 3)}
   * @default 0
   */
  testActionMode: number | 0 | 1 | 3;

  /**
   * 调用超时
   * @type {number}
   * @default -1
   */
  timeOut: number;

  /**
   * 事务模式
   * @description 值模式 [实体行为事务模式] {DEFAULT：默认、 REQUIRED：需要事务（没有新建）、 MANDATORY：需要事务（没有异常）、 NESTED：嵌套事务（没有新建）、 REQUIRES_NEW：挂起当前事务（没有新建）、 NOT_SUPPORTED：无事务（存在则挂起）、 SUPPORTS：支持事务（没有无事务）、 NONE：无事务、 GLOBAL：分布式事务、 USER：自定义、 USER2：自定义2 }
   * @type {( string | 'DEFAULT' | 'REQUIRED' | 'MANDATORY' | 'NESTED' | 'REQUIRES_NEW' | 'NOT_SUPPORTED' | 'SUPPORTS' | 'NONE' | 'GLOBAL' | 'USER' | 'USER2')}
   * @default DEFAULT
   */
  transactionMode: string | 'DEFAULT' | 'REQUIRED' | 'MANDATORY' | 'NESTED' | 'REQUIRES_NEW' | 'NOT_SUPPORTED' | 'SUPPORTS' | 'NONE' | 'GLOBAL' | 'USER' | 'USER2';

  /**
   * 异步操作行为
   * @type {boolean}
   * @default false
   */
  asyncAction: boolean;

  /**
   * 批操作行为
   * @type {boolean}
   * @default false
   */
  batchAction: boolean;

  /**
   * 预置行为
   * @type {boolean}
   * @default false
   */
  builtinAction: boolean;

  /**
   * 自定义行为参数
   * @type {boolean}
   * @default false
   */
  customParam: boolean;

  /**
   * 启用访问审计
   * @type {boolean}
   * @default false
   */
  enableAudit: boolean;

  /**
   * 支持后台执行
   * @type {boolean}
   * @default true
   */
  enableBackend: boolean;

  /**
   * 支持前台执行
   * @type {boolean}
   * @default true
   */
  enableFront: boolean;

  /**
   * 支持临时数据
   * @type {boolean}
   * @default false
   */
  enableTempData: boolean;

  /**
   * 准备操作之前数据
   * @type {boolean}
   * @default false
   */
  prepareLast: boolean;

  /**
   * 启用
   * @type {boolean}
   * @default true
   */
  valid: boolean;
}
